#include "bsp_timer.h"

#include "bsp_uart.h"

#ifdef RTOS

SemaphoreHandle_t BinSem_UART_Idle;

#endif

//Timer3 配置，用于uart0 的空闲中断
void BSP_Timer3_init(uint16_t u16Period)
{
    uint16_t                    u16ArrValue;
    uint16_t                    u16CntValue;
    stc_tim3_mode0_cfg_t     stcTim3BaseCfg;    
    //结构体初始化清零
    DDL_ZERO_STRUCT(stcTim3BaseCfg);
    
    Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外设时钟使能
    
    stcTim3BaseCfg.enWorkMode = Tim3WorkMode0;              //定时器模式
    stcTim3BaseCfg.enCT       = Tim3Timer;                  //定时器功能，计数时钟为内部PCLK
    stcTim3BaseCfg.enPRS      = Tim3PCLKDiv32;              //PCLK/32
    stcTim3BaseCfg.enCntMode  = Tim316bitArrMode;           //自动重载16位计数器/定时器
    stcTim3BaseCfg.bEnTog     = FALSE;
    stcTim3BaseCfg.bEnGate    = FALSE;
    stcTim3BaseCfg.enGateP    = Tim3GatePositive;
    
    Tim3_Mode0_Init(&stcTim3BaseCfg);                       //TIM3 的模式0功能初始化        
    u16ArrValue = 0x10000 - u16Period ; 
    Tim3_M0_ARRSet(u16ArrValue);                            //设置重载值(ARR = 0x10000 - 周期)  
    u16CntValue = 0x10000 - u16Period;   
    Tim3_M0_Cnt16Set(u16CntValue);                          //设置计数初值   
    Tim3_ClearIntFlag(Tim3UevIrq);                          //清中断标志	
    Tim3_Mode0_EnableIrq();                                 //使能TIM3中断(模式0时只有一个中断)	
    EnableNvic(TIM3_IRQn, IrqLevel3, TRUE);                 //TIM3 开中断 
	//Tim3_M0_Run();   //TIM3 运行
}

/*去初始化,进低功耗功耗前调用此接口*/
void BSP_Timer3_Deinit(void)
{
	stc_tim3_mode0_cfg_t     stcTim3BaseCfg;    
    DDL_ZERO_STRUCT(stcTim3BaseCfg);			 //结构体初始化清零
	Tim3_Mode0_Init(&stcTim3BaseCfg);   
	Tim3_ClearIntFlag(Tim3UevIrq);                //清中断标志	
    Tim3_Mode0_DisableIrq(); 
	Tim3_M0_Stop();
}

/*******************************************************************************
 * TIM3中断服务函数 (2ms)
 模式0 计时溢出中断
 原理： 以2ms*5 = 10ms为时间基准,uart cnt 没有变化,没有接收到新的数据,发出空闲中断信号,失能timer.
        如果在10ms内 uart_cnt累加,则接收到了新的数据,第一帧数据启动timer。
 ******************************************************************************/
void Tim3_IRQHandler(void)
{	
	BaseType_t xHigherPriorityTaskWoken;

	if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
    {	
        Tim3_ClearIntFlag(Tim3UevIrq);  //Timer3模式0 中断标志清除  
		
		UART_Idle.timer_cnt++;
		
		if(UART_Idle.timer_cnt >= 5)
		{
			UART_Idle.timer_cnt = 0;
			if(UART_Idle.uart_cnt == AT_RXbuff.rx_len) /*10ms后数据无增长,说明接收完毕*/
			{
				//printf("Receive data finish,%d\r\n",AT_RXbuff.rx_len);
				Tim3_M0_Stop();	
				// 发送信号量add here
				xSemaphoreGiveFromISR(BinSem_UART_Idle,&xHigherPriorityTaskWoken);
				portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的话进行一次任务切换	
			}
		}	
    }
}


 //BSP_Timer3_init(250);	/*32分频,周期 = 250*(1/4M)*32 = 2000us = 2ms */

